//? 这一步是对构造函数执行后的返回值进行判断.
//? 在正常使用new操作符时，如果构造函数返回的是一个对象或者函数类型的值，那么new操作符最终返回的就是这个返回值；
//? 如果构造函数没有显式返回值或者返回的是非对象、非函数类型的值，那么new操作符就返回创建的那个实例对象


function myNew2(constructFn,...args) {
    let obj = {}
    obj.__proto__ = constructFn.prototype
    const res = constructFn.apply(obj,args)
    return res instanceof Object ? res : obj
}
function Animal(name,age) {
    this.name = name;
    this.age = age
}
let animal = myNew2(Animal, 'dog',23)
console.log(animal);
